package pincipal.pack;

import java.util.ArrayList;
import java.util.Iterator;

import partidas.Partida;


import materiales.Material;

import database.Consulta;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;

public class EditarPartida extends Activity {
 
	private EditText observacion;
	private EditText nombrePartida;
	private ListView materiales;
	private ArrayList<String> seleccionados;
	private ArrayList<String> rendimientosOriginales;
	private ArrayList<String> rendimientos;
	private Bundle bundle;
	private Button aceptar;
	private Button cancelar;
	private String[] lista;
	private String nombreOriginal;
	private String observacionOriginal;
	private ArrayList<String> seleccionadosOriginal;
	private int id;
	AdaptadorMaterialesPartida adaptador;
	private Button eliminarBar;
	private Button volverAtras;
	private Button volverMenuPrincipal;
	private Button seleccionarMateriales;
	private ProgressDialog pd;
	private boolean toast = false;
	@Override
	public void onCreate(Bundle b)
	{
		super.onCreate(b);
		requestWindowFeature( Window.FEATURE_NO_TITLE );
		setContentView(R.layout.editarpartida);		
		bundle = getIntent().getExtras();
		
		getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
		id = bundle.getInt("ID");
		
		this.nombrePartida = (EditText)findViewById(R.id.nombrePartida);
		nombrePartida.setText(bundle.getString("NOMBRENUEVO"));
		nombreOriginal = bundle.getString("NOMBREORIGINAL");
		
		this.observacion = (EditText)findViewById(R.id.observaciones);
		observacion.setText(bundle.getString("OBSERVACION"));
		observacionOriginal = bundle.getString("OBSERVACION");
		
		seleccionados = new ArrayList<String>();
		this.seleccionados = bundle.getStringArrayList("LISTA");
		this.seleccionadosOriginal = bundle.getStringArrayList("LISTA");
		
		this.rendimientosOriginales = bundle.getStringArrayList("LISTARENDIMIENTOS");
		
		llenarRendimientos();
		
		this.materiales = (ListView)findViewById(R.id.listaMateriales);
		adaptador = new AdaptadorMaterialesPartida(this);
		ArrayAdapter<String> adaptadorSimple;
	    adaptadorSimple = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, seleccionados);   		
	    this.materiales.setAdapter(adaptador);
	
	    this.aceptar = (Button)findViewById(R.id.botonFinalizar);
	    this.cancelar = (Button)findViewById(R.id.botonCancelar);
		
	    this.eliminarBar = (Button)findViewById(R.id.eliminar);
		this.volverMenuPrincipal = (Button)findViewById(R.id.menuPrincipal);
		this.volverAtras = (Button)findViewById(R.id.volverAtras);
		this.seleccionarMateriales = (Button)findViewById(R.id.seleccionarMateriales);
		
		this.aceptar.setOnClickListener(new OnClickListener() 
		{	
			public void onClick(View arg0) 
			{	
					String partida = nombrePartida.getText().toString().trim();	
					if(partida.trim().length() > 0)
					{
								if(!seleccionados.isEmpty())
								{
									if(!rendimientos.isEmpty() )
							          {
										if(faltanRendimientos() == false)
										{
											if(existenCambios())
											{
												if(!nombreOriginal.equalsIgnoreCase(nombrePartida.getText().toString().trim()))
												{
													if(!existePartida(nombrePartida.getText().toString().trim()))
													{
														Cursor materialesPartida = Consulta.consultMaterialesPartida(EditarPartida.this, nombreOriginal);
														
														if(materialesPartida.getCount() <= seleccionados.size())// si se agregaron materiales o hay que editar los existentes
														{
															Consulta.editPartida(EditarPartida.this, id, nombreOriginal,nombrePartida.getText().toString().trim() ,observacion.getText().toString().trim());			
															Consulta.editPartidaPresupuestoReferencia(EditarPartida.this, nombreOriginal, nombrePartida.getText().toString().trim());
															int contador = 0;
															Iterator iteradorSeleccionados = seleccionados.listIterator();
															while( iteradorSeleccionados.hasNext() ) 
															{			
																String material = (String)iteradorSeleccionados.next(); 
																Cursor existe = Consulta.consultMaterialPartida(EditarPartida.this, nombreOriginal, material);
																if(existe.getCount()>0)
																{
																	Consulta.editMaterialPartida(EditarPartida.this, nombreOriginal, nombrePartida.getText().toString().trim(), material, rendimientos.get(contador));
																	contador ++;
																}
																else
																{			
																	Consulta.insertMaterialPartida(EditarPartida.this, nombrePartida.getText().toString().trim(), material, rendimientos.get(contador));
																	contador ++;
																}
															}
															toast = true;			
															llamarDialog("Guardando");
															
														}
														else
														{
															Consulta.editPartida(EditarPartida.this, id, nombreOriginal,nombrePartida.getText().toString().trim() ,observacion.getText().toString().trim());
															Consulta.editPartidaPresupuestoReferencia(EditarPartida.this, nombreOriginal, nombrePartida.getText().toString().trim());
															
															ArrayList<String> materiales = new ArrayList<String>();
															if (materialesPartida.moveToFirst())
											                {
											                	do {
											                		String material = materialesPartida.getString(1);
											                		materiales.add(material);    
											                   } while(materialesPartida.moveToNext());    	
											                } 
															
															for(int i = 0; i<materiales.size();i++)
															{
																if(!seleccionados.contains(materiales.get(i)))
																{
																	Consulta.deleteMaterialPartida(EditarPartida.this, "'"+nombreOriginal+"'", "'"+materiales.get(i)+"'");
																}							
															}
															toast = true;
															llamarDialog("Guardando");
															
															}
													}
													else
													{
														Toast.makeText(EditarPartida.this, "Nombre de Partida ya existe" , Toast.LENGTH_SHORT).show();
													}
												}
												else
												{
													Cursor materialesPartida = Consulta.consultMaterialesPartida(EditarPartida.this, nombreOriginal);
													if(materialesPartida.getCount() <= seleccionados.size())// si se agregaron materiales o hay que editar los existentes
													{
														Consulta.editPartida(EditarPartida.this, id, nombreOriginal,nombrePartida.getText().toString().trim() ,observacion.getText().toString().trim());
														Consulta.editPartidaPresupuestoReferencia(EditarPartida.this, nombreOriginal, nombrePartida.getText().toString().trim());
														int contador = 0;
														Iterator iteradorSeleccionados = seleccionados.listIterator();
														while( iteradorSeleccionados.hasNext() ) 
														{			
															String material = (String)iteradorSeleccionados.next(); 
															Cursor existe = Consulta.consultMaterialPartida(EditarPartida.this, nombreOriginal, material);
															if(existe.getCount()>0)
															{
																Consulta.editMaterialPartida(EditarPartida.this, nombreOriginal, nombrePartida.getText().toString().trim(), material, rendimientos.get(contador));
																contador ++;
															}
															else
															{			
																Consulta.insertMaterialPartida(EditarPartida.this, nombrePartida.getText().toString().trim(), material, rendimientos.get(contador));
																contador ++;
															}
														}
														toast = true;		
														llamarDialog("Guardando");
														
													}
													else
													{
														ArrayList<String> materiales = new ArrayList<String>();
														if (materialesPartida.moveToFirst())
										                {
										                	do {
										                		String material = materialesPartida.getString(1);
										                		materiales.add(material);    
										                   } while(materialesPartida.moveToNext());    	
										                } 
														
														for(int i = 0; i<materiales.size();i++)
														{
															if(!seleccionados.contains(materiales.get(i)))
															{
																Consulta.deleteMaterialPartida(EditarPartida.this, "'"+nombreOriginal+"'", "'"+materiales.get(i)+"'");
															}							
														}
														toast = true;
														llamarDialog("Guardando");
														
													}
												}
												
											}
											else
											{
												toast = false;
												llamarDialog("Cargando");
												
											}											
										}
										else
										{
											Toast.makeText(EditarPartida.this, "Ingrese rendimientos", Toast.LENGTH_SHORT).show();
										}		   
							          }
									  else
							          {
							        	  Toast.makeText(EditarPartida.this, "Debe ingresar Rendimientos", Toast.LENGTH_SHORT).show();
							          }
								}
								else 
								{
									Toast.makeText(EditarPartida.this, "Debe seleccionar Materiales", Toast.LENGTH_SHORT).show();	
								}
					    }
						else
						{
							Toast.makeText(EditarPartida.this, "Debe ingresar Nombre de Partida", Toast.LENGTH_SHORT).show();						
						}		
			}
		});
	    
	    this.cancelar.setOnClickListener(new OnClickListener() 
		{	
			public void onClick(View arg0) 
			{	
				toast = false;
				llamarDialog("Cargando");
				
			}
		});
	    
	    this.seleccionarMateriales.setOnClickListener(new OnClickListener() 
		{	
			public void onClick(View arg0) 
			{			
				Bundle bund = new Bundle();
				bund.putString("NOMBRENUEVO",nombrePartida.getText().toString());
				bund.putString("NOMBREORIGINAL",nombreOriginal);
				bund.putString("OBSERVACION", observacion.getText().toString());
				bund.putStringArrayList("SELECCIONADOS", seleccionados);
				bund.putString("VOLVER", "EditarPartida");
				bund.putStringArrayList("LISTARENDIMIENTOS", rendimientos);
				Intent intent = new Intent(EditarPartida.this, SeleccionarMaterial.class);
				intent.putExtras(bund);
				startActivity(intent);					
			}
		});

		this.volverMenuPrincipal.setOnClickListener( new OnClickListener()
	    {
	    	public void onClick(View v)
	    	{
	    		Intent intent = new Intent(EditarPartida.this, CubicMagic.class);
	    		startActivity(intent);
	    	}   	
	    });
			
		this.volverAtras.setOnClickListener( new OnClickListener()
	    {
	    	public void onClick(View v)
	    	{
	    		toast = false;
	    		llamarDialog("Cargando");
	    		
	    	}      	
	    });
	    
		materiales.setOnItemClickListener( new OnItemClickListener()
		{
			public void onItemClick(AdapterView<?> a, View v, int position, long id) 
    		{
				Log.i("position: ",String.valueOf(position));
	    		seleccionados.remove(position);
                adaptador.notifyDataSetChanged();
            }
		});
		
	}	
	
	private boolean existePartida(String nombre)
	{
		Cursor consulta = Consulta.consultNombrePartida(EditarPartida.this, "'"+nombre+"'");
		if(consulta.getCount() > 0)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	
	private void llenarRendimientos()
    {	
		rendimientos = new ArrayList<String>();
    	int indice = seleccionados.size();
    	for(int i = 0; i< indice; i++)
    	{
    		if(!rendimientosOriginales.isEmpty())
    		{
	    		if(rendimientosOriginales.get(i) != "")
	    		{
	    		  rendimientos.add(i, rendimientosOriginales.get(i));
	    		}
	    		else
	    		{
	    			rendimientos.add(i, "--");
	    		}
    		}
    		else
    		{
    			rendimientos.add(i, "--");
    		}
       	}
    }
	
	private boolean faltanRendimientos()
	{
		boolean retorno = false;	
		Iterator iterador = rendimientos.listIterator();
			while( iterador.hasNext() ) 
			{		
				String rend = (String) iterador.next();
				if(rend.equals("--") || rend.equals("") )
		        {
			          retorno = true;						          	          							         
		        }			
		    }
		return retorno;
	}
	
	
	private boolean existenCambios()
	{			
		Cursor materialesPartida = Consulta.consultMaterialesPartida(EditarPartida.this, nombreOriginal);
		ArrayList<String> materiales = new ArrayList<String>();
		if (materialesPartida.moveToFirst())
        {
        	do {
        		String material = materialesPartida.getString(1);
        		materiales.add(material);    
           } while(materialesPartida.moveToNext());    	
        }	
		
		if(nombreOriginal.equalsIgnoreCase(nombrePartida.getText().toString()) && 
			observacionOriginal.equalsIgnoreCase(observacion.getText().toString()) &&
			materiales.equals(seleccionados) &&
			rendimientosOriginales.equals(rendimientos))
		{
			return false;
		}
		else
		{
			return true;
		}
	}
	
	private void actualizar()
	{
		Cursor fila =(Cursor)Consulta.consultPartidas(EditarPartida.this);
		String[] lista = new String[]{};
		lista = new String[fila.getCount()];
		ArrayList<Partida> arrayPartidas = new ArrayList<Partida>();
		int i = 0;
		Partida partida;
		if (fila.moveToFirst())
        {
        	do {
    
        		lista[i] = fila.getString(1);
        		partida = new Partida( fila.getInt(0), fila.getString(1), fila.getString(2)); 		
        		arrayPartidas.add(partida);
                i++;
                String nombrePartida = partida.getNombre();
                Cursor materiales =(Cursor)Consulta.consultMaterialesPartida(EditarPartida.this, nombrePartida);
                if (materiales.moveToFirst())
                {
                	do {
                		String material = materiales.getString(1);
                		String rendimiento = materiales.getString(2);
                		partida.setMaterial(material, rendimiento);      
                   } while(materiales.moveToNext());    	
                } 
                
           } while(fila.moveToNext());    	
        } 	
		Bundle bundleMaterial = new Bundle();
		bundleMaterial.putStringArray("LISTA", lista);	
		bundleMaterial.putString("TIPO", "partida");
		Intent intent = new Intent(EditarPartida.this, Buscar.class);
		intent.putExtra("ARRAY",arrayPartidas);
		intent.putExtras(bundleMaterial);       		
		startActivity(intent);		
	}
	
	class AdaptadorMaterialesPartida extends ArrayAdapter {

		Activity context;		
		@SuppressWarnings("unchecked")
		public AdaptadorMaterialesPartida(Activity context) 
		{
			super(context, R.layout.list_item, seleccionados);
			this.context = context;
			
		}
			
	public View getView(int position, View convertView, ViewGroup parent) {
			LayoutInflater inflater = context.getLayoutInflater();
			final int posicion = position;
			
			View item = inflater.inflate(R.layout.item_material_partida, null);			
			TextView nombre = (TextView)item.findViewById(R.id.nombreMaterial);
			nombre.setText(seleccionados.get(position));
			
			final EditText rendimiento = (EditText)item.findViewById(R.id.rendimientoMaterial);
			
			rendimiento.setText(rendimientosOriginales.get(posicion));
			
			rendimiento.addTextChangedListener( new TextWatcher()
			{
				public void afterTextChanged(Editable s) {
					rendimientos.set(posicion, String.valueOf(s));
				}
				public void beforeTextChanged(CharSequence s, int start, int count,
						int after) {	
				}
				public void onTextChanged(CharSequence s, int start, int before,
						int count) {						
				}	
			});
			
			
			Button boton = (Button)item.findViewById(R.id.eliminarMaterialPartida);
			boton.setBackgroundResource(android.R.drawable.ic_menu_delete);
			boton.setOnClickListener(new OnClickListener()
			{
				public void onClick(View arg0) {
					seleccionados.remove(posicion);
					rendimientos.remove(posicion);
					rendimientosOriginales = rendimientos;
					llenarRendimientos();
					notifyDataSetChanged();					
				}
			});
			
			return(item);
		}	
	}
	private void llamarDialog(String mensaje)
	{
		pd = ProgressDialog.show(this, mensaje, "Por favor espere...", true, false);
		new DownloadTask().execute("Parametros que necesite el DownloadTask");
	}
	
	private class DownloadTask extends AsyncTask<String, Void, Object> {
        protected String doInBackground(String... args) {
            actualizar();
            return "Datos ya procesados (resultado)";
        }

        protected void onPostExecute(Object result) {
            if(toast)
         	 {
         		Toast.makeText(EditarPartida.this, "Partida guardada exitosamente", Toast.LENGTH_SHORT).show();			
  			
         	 }
        	if (EditarPartida.this.pd != null) {
            	EditarPartida.this.pd.dismiss();
            }
        }
   }
}